﻿function calculateBrowserWindowSize() {
	var winW = 630, winH = 460;
	if (document.body && document.body.offsetWidth) {
		winW = document.body.offsetWidth;
		winH = document.body.offsetHeight;
	};
	if (window.innerWidth && window.innerHeight) {
		winW = window.innerWidth;
		winH = window.innerHeight;
	};
	return {
		width: winW,
		height: winH,
	};
};

function stringFormat(args) {   
	var str = this.toString();
	var searchIndex = 0;
	var counter = 0;

	do {
		searchIndex = str.indexOf("{%}", searchIndex);
		if (searchIndex > -1) {
			str = str.substring(0, searchIndex) + args[counter] + str.substring(searchIndex + 3, str.length);
			searchIndex += args[counter++].length;
		}
	} while (searchIndex > -1);

	return str;
};

String.prototype.format = stringFormat;

function select(rule) {
	switch (rule) {
		case 1: // нажатие "Добавить зону"
			{
				$('#add-area').addClass('ui-disabled');
				$('#check-area').addClass('ui-disabled');
				$('#refresh-area').removeClass('ui-disabled');
				$('#delete-area').removeClass('ui-disabled');
				break;
			}
		case 2: // завершено рисование
			{
				$('#add-area').addClass('ui-disabled');
				$('#check-area').removeClass('ui-disabled');
				$('#refresh-area').removeClass('ui-disabled');
				$('#delete-area').removeClass('ui-disabled');
				break;
			}
		case 3: // нажатие "Начать сначала"
			{
				$('#add-area').addClass('ui-disabled');
				$('#check-area').addClass('ui-disabled');
				$('#refresh-area').removeClass('ui-disabled');
				$('#delete-area').removeClass('ui-disabled');
				break;
			}
		case 4: // нажатие "Прекратить"
			{
				$('#add-area').removeClass('ui-disabled');
				$('#check-area').addClass('ui-disabled');
				$('#refresh-area').addClass('ui-disabled');
				$('#delete-area').addClass('ui-disabled');
				break;
			}
	}
};

var gMap;
var map;
var carMarkers = {};
var timeOut = 5000;
var agingInterval = 1000 * 60 * 10;
var viewingArea;
var infoContent = "<h3>{%}</h3><U>Серийный номер</u>: <i>{%}</i><br/>" +
	"<u>Тип машины</u>: <i>{%}</i><br/>" +
	"<u>Организация</u>: <i>{%}</i><br/>" +
	"<u>Широта</u>: <i>{%}</i><br/>" +
	"<u>Долгота</u>: <i>{%}</i><br/>" +
	"<u>Дата</u>: <i>{%}</i><br/><br/>" +
	"<a href='/Home/DetailsCar/{%}' rel='external'>подробнее >></a>";

// Инициализация карты.
function initialize() {

	var latlngCenter = new google.maps.LatLng(53.916666676667, 27.55000001);
	var mapOptions = {
		zoom: 12,
		center: latlngCenter,
		streetViewControl: false,
		scaleControl: true,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};
	map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
	$('#map_canvas').height(calculateBrowserWindowSize().height - 200);
	$('#map_canvas').css("cursor", "crosshair");

	// Установка карты по границам Республики Беларусь.
	//
	var bounds = new google.maps.LatLngBounds(new google.maps.LatLng(51.44, 23.39),
		new google.maps.LatLng(55.91, 31.56));
	map.fitBounds(bounds);

	gMap = new DrawingArea({
		map: map,
		editorStyle: {
			enableBorder: true,
			enableDotted: true,
			enableMarkers: false
		}
	}); // создание объекта для работы с картой

	gMap.subscribe("end_drawing", function () {
		select(2);
	});
	select(4);

};

function setIconUpdatedObsolete(markerId, date) {
	if ((new Date() - new Date(date)) > agingInterval) {
		carMarkers[markerId].setIcon(
			{
				icon: "/Images/CarLogo/karer_old.png"
			});
	} else {
		carMarkers[markerId].setIcon(
		   {
			   icon: "/Images/CarLogo/karer.png"
		   });
	}
};

function constructDateString(retrievedDate) {
	var year = retrievedDate.getFullYear();
	var month = ('0' + (retrievedDate.getMonth() + 1)).slice(-2);
	var day = ('0' + retrievedDate.getDate()).slice(-2);
	var hours = retrievedDate.getHours();
	var minutes = ('0' + retrievedDate.getMinutes()).slice(-2);
	var dateStr = year + "-" + month + "-" + day + " " + hours + ":" + minutes;
	return dateStr;
};

$(document).ready(function (event) {

	// Создание модального окна сохранения зоны
	// с заголовком по центру.
	//
	$("#dialog-save").jqxWindow({
		width: "380px", autoOpen: false, isModal: true,
		draggable: false, resizable: false, showCloseButton: false,
		animationType: 'fade', theme: "black"
	});
	$("#dialog-save-header :first-child").css("float", "");

	// Создание модального окна удаления зоны
	// с заголовком по центру.
	//
	$("#dialog-delete").jqxWindow({
		width: "480px", autoOpen: false, isModal: true,
		draggable: false, resizable: false, showCloseButton: false,
		animationType: 'fade', theme: "black"
	});
	$("#dialog-delete-header :first-child").css("float", "");

	HTMLBodyElement.onload = initialize();

	// Создание маркера на каждую машину из списка.
	$('[name=car-choice]').each(function () {
		carMarkers[this.value] = new gMap.Marker(map);
		carMarkers[this.value].setIcon(
			{
				icon: "/Images/CarLogo/karer.png"
			});
		if ($(this).is(':checked') == true) {
			showCar(this.value);
		}
	});
	
	setInterval(function () {
		$('[name=car-choice]').each(function () {
			// Если машина выбрана для показа на карте, то обновить ее данные.
			if ($(this).is(':checked') == true) {
				// Запрос общих сведений о машине.
				$.ajax({
					url: '/data/CarMeasuring/',
					data: { id: this.value },
					cache: false,
					type: 'GET',
					contentType: 'application/json; charset=utf-8',
					success: function (carInfo) {
						setIconUpdatedObsolete(carInfo.CarId, carInfo.CarCoords.Date);
						// В случае удачи запроса общих сведений о машине запрашиваются дополнительные данные.
						$.ajax({
							url: '/data/Car/',
							data: { id: carInfo.FK_CarId },
							cache: true,
							type: 'GET',
							contentType: 'application/json; charset=utf-8',
							success: function (carOutput) {
								if (carOutput) {
									var retrievedDate = new Date(carInfo.CarCoords.Date);
									var dateStr = constructDateString(retrievedDate);
									var iCont = infoContent.format([carInfo.CarName, carOutput.SerialNumber, carOutput.TypeOfCar,
										carOutput.Organization, carInfo.CarCoords.X + '', carInfo.CarCoords.Y + '', dateStr + '', carInfo.CarId]);
									carMarkers[carInfo.CarId].setInfoContent(iCont);
									carMarkers[carInfo.CarId].setPosition(new gMap.LatLng(carInfo.CarCoords.X, carInfo.CarCoords.Y));
								}
							},
							error: function (e) {
								alert(e.responseText);
							}
						});
					},
					error: function (e) {
						alert(e.responseText);
					}
				});
			}
		});
	}, timeOut);
	
	viewingArea = new gMap.Area(map);

	window.onresize = function() {
		$('#map_canvas').height(calculateBrowserWindowSize().height - 120);
	};

	/* Добавление "прослушки" необходимых событий */
	$('#add-area').bind('click', function (e) {
		e.preventDefault();
		//$(this).addClass('ui-btn-active');

		gMap.enableAdding();
		select(1);
	//$('#delete-area').attr('disabled', 'disabled');
		return false;
	});
	$('#check-area').bind('click', function (e) {
		e.preventDefault();
		//gMap.saveArea();
		$('#dialog-save').jqxWindow('open');
		return false;
	});
	$('#save-area-confirmed').bind('click', function (e) {
		e.preventDefault();
		//var comment = { id: 0, Id: 0, Name: "vdv", Text: "Vdv" };

		var coordsArray = gMap.areaObj.areaPoly.getPath().getArray();
		var coords = JSON.stringify(gMap.boxingGoogleCoords(coordsArray));
		var carsId = [];
		for (var i = 0, checkedCarList = $("input[name=car-choice]:checked"); i < checkedCarList.length; i++) {
			carsId.push(checkedCarList[i].value);
		}
		var arrCarsId = JSON.stringify(carsId);
		var obj = { AreaTitle: $('#areaTitle').val(), AreaComment: $('#areaComment').val(), AreaCoords: coords, AreaCarsId: arrCarsId};
		var json = JSON.stringify(obj);

		$.ajax({
			url: '/data/Areas',
			cache: false,
			type: 'post',
			data: json, //JSON.stringify({Id: 22, Name: "Alik", Text: "this is me"}),
			contentType: 'application/json; charset=utf-8',
			success: function (data) {
				var htmlListitem = ('<li data-name="area-listitem" data-value={%} style="margin: 0; padding: 0px 10px;">' +
					'<a data-name="area-choice" id=car_{%}>' +
					'<h3 style="margin: 0; padding: 0;">{%}</h3>' +
					'<p style="margin: 0; padding: 0;">{%}</p>' +
					'</a>' +
					'<a data-name="area-delete" data-icon="delete" data-iconpos="notext">Удалить зону</a> </li>').format([data.AreaId+'', data.AreaId+'', data.AreaTitle, data.AreaComment]);
				$("[data-name=area-list]").append(htmlListitem).listview('refresh');
				clearCarSelection();
				gMap.hideAreasOnMap();
				clickedAreaId = 'undefined';
				select(4);
				$.mobile.loading('hide');
				$('#dialog-save').jqxWindow('close');
			},
			error: function (error) {
				$.mobile.loading('hide');
				alert(error.responseText);
			}
		});
		$.mobile.loading('show');
		return false;
	});
	$('#refresh-area').bind('click', function (e) {
		e.preventDefault();
		gMap.startOverArea();
		select(3);
		return false;
	});
	$('#delete-area').bind('click', function (e) {
		e.preventDefault();
		$('#add-area').removeClass('ui-btn-active');
		gMap.disableAdding();
		select(4);
		return false;
	});
		
	$('#close-dialog-save').bind('click', function (e) {
		e.preventDefault();
		$('#dialog-save').jqxWindow('close');
		return false;
	});
	$('#delete-area-confirmed').bind('click', function (e) {
		e.preventDefault();
		$.ajax({
			url: '/data/Areas/' + idAreaToDelete,
			cache: false,
			type: 'delete',
			contentType: 'application/json; charset=utf-8',
			success: function (data) {
				$('[data-name=area-list] [data-value={%}]'.format([idAreaToDelete])).remove();
				viewingArea.hideArea();
				clickedAreaId = 'undefined';
				$.mobile.loading('hide');
				$('#dialog-delete').jqxWindow('close');
			},
			error: function (error) {
				$.mobile.loading('hide');
				alert(error.responseText);
			}
		});
		$.mobile.loading('show');
		return false;
	});
	$('#delete-area-canceled').bind('click', function (e) {
		e.preventDefault();
		$('#dialog-delete').jqxWindow('close');
		return false;
	});
		
	$("input[name=area-choise]").click(function() {
		if ($(this).is(':checked') == true) {
			//$("#input[name=area-choise]:not(:checked)").css("background-color", "yellow");
			$.ajax({
				url: '/data/Areas',
				data: { id: this.value },
				cache: false,
				type: 'GET',
				contentType: 'application/json; charset=utf-8',
				success: function (data) {
					var coords = JSON.parse(data.Coord);
					viewingArea.placeArea(gMap.createPath(coords));
					//  gMap.showAreaOnMap(path);
				}
			});
		}
		else {
			viewingArea.hideArea();
		}
		//return false;
	});

	var clickedAreaId;
		
	$('a[data-name=area-choice]').live('click', function () {
		var areaId = $(this).parents("li").attr('data-value');
		if (clickedAreaId != areaId)
		{
			clickedAreaId = areaId;
			clearCarSelection();
			viewingArea.hideArea();
			$.ajax({
				url: '/data/Areas',
				data: { id: areaId },
				cache: false,
				type: 'GET',
				contentType: 'application/json; charset=utf-8',
				success: function(data) {
					var timerCounter = 0;
					for (var i = 0, carsId = JSON.parse(data.AreaCarsId) ; i < carsId.length; i++) {
						   
						$.ajax({
							url: '/data/CarMeasuring/',
							data: { id: carsId[i] },
							cache: false,
							type: 'GET',
							contentType: 'application/json; charset=utf-8',
							success: function(carInfo) {
								$.ajax({
									url: '/data/Car/',
									data: { id: carInfo.FK_CarId },
									cache: false,
									type: 'GET',
									contentType: 'application/json; charset=utf-8',
									success: function (carOutput) {
										if (carOutput) {
											var retrievedDate = new Date(carInfo.CarCoords.Date);
											var dateStr = constructDateString(retrievedDate);
											
											var iCont = infoContent.format([carInfo.CarName, carOutput.SerialNumber, carOutput.TypeOfCar,
																			carOutput.Organization, carInfo.CarCoords.X + '', carInfo.CarCoords.Y + '', dateStr + '', carInfo.CarId]);
											setTimeout(function() {
												carMarkers[carInfo.CarId].placeInfoMarker(new gMap.LatLng(carInfo.CarCoords.X, carInfo.CarCoords.Y), iCont);
												$('[name=car-choice][value=' + carInfo.CarId + ']').attr('checked', true).checkboxradio("refresh");
											}, timerCounter++ * 190);
										} 
									}
								});
							}
						});
					}
					var coords = JSON.parse(data.AreaCoords);
					viewingArea.placeArea(gMap.createPath(coords));
					gMap.fitArea(viewingArea.polygon);
					//  gMap.showAreaOnMap(path);
				}
			});
		}
	});
	$('a[data-name=area-choice]').live('mouseover', function () {
		var comment = $(this).children('p').text();
		$(this).attr("title", comment);
	});
	/*$('#area-listitem > li a[data-name=area-choice]').live('mouseout', function () {
		$(this).attr("title", ""); 
	});*/
	var idAreaToDelete;
	$('a[data-name=area-delete]').live('click', function () {
		idAreaToDelete = $(this).parents("li").attr("data-value");
		$('#dialog-delete').jqxWindow('open'); 
	});

	$("#car-collapse-expand").bind('click', function() {
		if ($(this).data('icon') === "minus") {
			$(this).data('icon', 'plus');
			$(this).find('.ui-icon').addClass("ui-icon-plus").removeClass("ui-icon-minus");
			$(this).attr("title", "Развернуть");
			$('#car-list').hide();
		} else {
			$(this).data('icon', 'minus');
			$(this).find('.ui-icon').addClass("ui-icon-minus").removeClass("ui-icon-plus");
			$(this).attr("title", "Свернуть");
			$('#car-list').show();
		}
	});
		
	$("#area-collapse-expand").bind('click', function () {
		if ($(this).data('icon') === "minus") {
			$(this).data('icon', 'plus');
			$(this).find('.ui-icon').addClass("ui-icon-plus").removeClass("ui-icon-minus");
			$(this).attr("title", "Развернуть");
			$('[data-name=area-listitem]').hide();
		} else {
			$(this).data('icon', 'minus');
			$(this).find('.ui-icon').addClass("ui-icon-minus").removeClass("ui-icon-plus");
			$(this).attr("title", "Свернуть");
			$('[data-name=area-listitem]').show();
		}
	});
		
	$("#clear-area-selection").bind('click', function () {
		viewingArea.hideArea();
		clickedAreaId = 'undefined';
		//clearCarSelection();
	});

	$("#clear-car-selection").bind('click', clearCarSelection);

	function clearCarSelection() {
		$('[name=car-choice]').each(function () { $(this).attr("checked", false).checkboxradio("refresh"); });
		//gMap.hideMarkersOnMap();
		for (var m in carMarkers) {
			if (carMarkers[m] != null)
				carMarkers[m].hideMarker();
		}
	};

	// Выбор машины из списка.
	//
	$('[name=car-choice]').click(function() {
		// Если машина выбрана для показа на карте, то...
		if ($(this).is(':checked') == true) {
			showCar(this.value);
		}
		// иначе убрать машину с карты.
		else {
			carMarkers[this.value].hideMarker();
		}
	});

	function showCar(id) {
		// Запрос общих сведений о машине.
		$.ajax({
			url: '/data/CarMeasuring/',
			data: { id: id },
			cache: false,
			type: 'GET',
			contentType: 'application/json; charset=utf-8',
			success: function (carInfo) {
				setIconUpdatedObsolete(carInfo.CarId, carInfo.CarCoords.Date);
				// В случае удачи запроса общих сведений о машине запрашиваются дополнительные данные.
				$.ajax({
					url: '/data/Car/',
					data: { id: carInfo.FK_CarId },
					cache: false,
					type: 'GET',
					contentType: 'application/json; charset=utf-8',
					success: function (carOutput) {
						if (carOutput) {
							var retrievedDate = new Date(carInfo.CarCoords.Date);
							var dateStr = constructDateString(retrievedDate);
							
							var iCont = infoContent.format([carInfo.CarName, carOutput.SerialNumber, carOutput.TypeOfCar,
															carOutput.Organization, carInfo.CarCoords.X + '', carInfo.CarCoords.Y + '', dateStr, carInfo.CarId]);
							carMarkers[carInfo.CarId].placeCenterInfoMarker(new gMap.LatLng(carInfo.CarCoords.X, carInfo.CarCoords.Y), iCont);
						}
						//carMarkers[carInfo.CarId] = marker;
					},
					error: function (e) {
						alert(e.responseText);
					}
				});
			},
			error: function (e) {
				alert(e.responseText);
			}
		});
	};
});